ЛАБОРАТОРНАЯ РАБОТА №
6
«Работа с графикой в Java»

Исходный код примера:
package tsn.javase.lab06;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.JPanel;
public class Form1 extends javax.swing.JFrame {
public class MyPicture extends JPanel { // КЛАСС РИСОВАНИЯ СВОЕЙ КАРТИНКИ
Graphics2D canvas; // Класс рисования
BufferedImage buff; // Буферное изображение
int x = 400; // Константа размера полотна по х
int y = 250; // Константа размера полотна по y
MyPicture() {
// Создаем буферное полотно для рисования размером x-y
buff = new BufferedImage(x, y, BufferedImage.TYPE_INT_RGB);
// Создаем двустороннюю связь между буферным изображением и классом рисования
canvas = (Graphics2D) buff.getGraphics();
canvas.setPaint(Color.GRAY); // Устанавливаем цвет рисования серым
canvas.fillRect(0, 0, x, y); // Заливаем полотно для рисования
canvas.setPaint(Color.BLACK); // Устанавливаем цвет рисования черным
canvas.drawOval(100, 80, 90, 90); // Отрисовываем большой овал
canvas.drawArc(100, 115, 90, 30, 180, 180); // Отрисовываем дугу по середине овала
//рисуем два мелньких круга сверху и снизу
canvas.drawOval(140, 70, 10, 10);
canvas.drawOval(140, 170, 10, 10);
//устанавливаем стиль и пишим текст
canvas.setFont(new Font("Tahoma", Font.BOLD | Font.ITALIC, 40));
canvas.drawString("Java!", 85, 50);
try {
// При помощи созданной функции заливки закрашиваем две части главного овала
// и два маленьких кружка
fill(110, 110, Color.GRAY, Color.WHITE);
fill(140, 150, Color.GRAY, Color.RED);
fill(145, 75, Color.GRAY, Color.RED);
fill(145, 175, Color.GRAY, Color.WHITE);
} catch (Exception ex) {
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // Отрисовываем панель и компоненты на ней
g.drawImage(buff, 0, 0, this); // Отрисовываем буфер с нашим изображением на панель
}
private void fill(int x, int y, Color bgcolor, Color color) throws Exception {
// Заливка фигур методом ромба, параметры: х,y- координаты начала заливки,
// bgcolor-цвет который надо закрашивать, color-цвет которым надо закрашивать
ArrayList point = new ArrayList<>(); // Создаем динамический массив точек
point.add(new Point(x, y)); // Добавляем начальную точку в массив
Color oldColor = canvas.getColor(); // Сохраняем старый цвет рисования
canvas.setPaint(color); //ставим цвет закраски
while (point.size() > 0) { // Пока в массиве имеются точки для закрашивания
Point p = point.remove(0); // Считываем координаты первой точки, и удаляем ее из массива
x = p.x;
y = p.y;
if (bgcolor.getRGB() == buff.getRGB(x, y)) { // Если ее надо нам закрасить
canvas.drawLine(x, y, x, y); // Закрашиваем точку
point.add(new Point(x + 1, y)); // Добавляем точку справа
point.add(new Point(x - 1, y)); // Добавляем точку слева
point.add(new Point(x, y + 1)); // Добавляем точку снизу
point.add(new Point(x, y - 1)); // Добавляем точку сверху
}
}
canvas.setPaint(oldColor); //ставим старый цвет рисования
repaint(); // Перерисовываем изображение
}
}
public Form1() {
initComponents();
}
@SuppressWarnings("unchecked")
//
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jPanel1 = new MyPicture();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Работа с графикой в Java");
setIconImage(java.awt.Toolkit.getDefaultToolkit().createImage(getClass().getResource("icon.png")));
setResizable(false);
getContentPane().setLayout(null);
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/tsn/javase/lab06/task.png"))); // NOI18N
getContentPane().add(jLabel1);
jLabel1.setBounds(0, 241, 301, 47);
jPanel1.setBackground(new java.awt.Color(244, 243, 234));
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 290, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 240, Short.MAX_VALUE)
);
getContentPane().add(jPanel1);
jPanel1.setBounds(0, 0, 290, 240);
setSize(new java.awt.Dimension(296, 320));
setLocationRelativeTo(null);
}//
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Form1.class
.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Form1.class
.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Form1.class
.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Form1.class
.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Form1().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}